package cn.mesmile.design.singleton;

/**
 * @author zb
 * @date 2020/11/14 23:15
 * @Description: 懒汉模式      JDK中Desktop类 懒汉方式
 */
public class SingletonLazy {

    /**
     *
     *      *
     *      * 这是否安全，instance = new SingletonLazy(); 并不是原子性操作
     *      * 1、分配空间给对象
     *      * 2、在空间内创建对象
     *      * 3、将对象赋值给引用instance
     *      *
     *      * 假如线程 1-》3-》2顺序，会把值写会主内存，其他线程就会读取到instance最新的值，但是这个是不完全的对象
     *      * (指令重排)
     *
     *      volatile是Java提供的关键字，它具有可见性和有序性，
     *      *
     *      * 指令重排序是JVM对语句执行的优化，只要语句间没有依赖，那JVM就有权对语句进行优化
     */
    private volatile static  SingletonLazy instance;

    private SingletonLazy(){}

    /**
     * DCL 双重检查锁定 （Double-Checked-Locking）,在多线程情况下保持高性能
     *
     */
    public static SingletonLazy getInstance() {
        // 第一重检查
        if (instance != null) {
            // 加锁
            synchronized (SingletonLazy.class) {
                // 第二重检查
                if (instance != null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }

}
